parser grammar Anasint;

options {
  language = Java;
  tokenVocab = Analex;
}
 
@header {
   package Practica5.Flex;
}

@members {
  protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException {
    throw new MismatchedTokenException(ttype, input);
  }

  public Object recoverFromMismatchedSet(IntStream input,RecognitionException e,BitSet follow) throws RecognitionException {
    throw e;
  }
} 

@rulecatch {
	catch (RecognitionException e) {
	  throw e;
	}
}
entrada: (sentencias) EOF;
sentencias: (bloqueA)+ separador_seccion (bloqueB)+ (separador_seccion (bloqueC)+)?;
 
bloqueA: definicion_flex | verbatim;
bloqueB: regla | comentario;
bloqueC: funcion;  
          
verbatim: LEFT_VERBATIM (definicion_c)* RIGHT_VERBATIM;
separador_seccion: SECTION;
comentario: (COMENTARIO_LINEA | COMENTARIO_BLOQUE);
regla: (macro)+ (OP_SUM|OP_MULT|QUESTIONMARK)? ID OP_INC SEPARADOR;
macro: MACRONAME | (LEFT_PAREN MACRONAME PIPE MACRONAME RIGHT_PAREN);
definicion_flex: ID ((RANGO)+|MACRONAME)(OP_MULT|OP_SUM|QUESTIONMARK|REPEAT)?;
definicion_c: (DATO_TIPO ID SEPARADOR | include);
include: ALMOHADILLA KEYWORD_INCLUDE OP_ME ID OP_MA;
funcion: funcion_cabecera (asignacion|inc_dec|pre_inc_dec|funcion_instancia)* (return_statement)? RIGHT_BRACE;
funcion_cabecera: (DATO_TIPO|KEYWORD_VOID) ID LEFT_PAREN (parametros|KEYWORD_VOID) RIGHT_PAREN LEFT_BRACE;
funcion_instancia: ID LEFT_PAREN (valores|COMA valores)* RIGHT_PAREN SEPARADOR; 
funcion_parametro: ID LEFT_PAREN (valores|COMA valores)* RIGHT_PAREN;
parametros: (DATO_TIPO ID (COMA DATO_TIPO ID)*)*;
asignacion: ID OP_ASSIGN valores SEPARADOR;
inc_dec: ((ID OP_SUM OP_SUM) | (ID OP_SUB OP_SUB));
pre_inc_dec: (OP_SUM OP_SUM ID) SEPARADOR;
valores: (puntero|STRING|NUMERO|funcion_parametro);
puntero: (OP_MULT)? ID; 
return_statement: KEYWORD_RETURN (NUMERO|ID)? SEPARADOR; 